package com.qf.smsplatform.strategy.service;

import com.qf.smsplatform.common.constants.CacheConstants;
import com.qf.smsplatform.common.model.StandardSubmit;
import com.qf.smsplatform.strategy.service.api.CacheService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Map;

@Component
public class StrategyExecutor {

    // 循环依赖   --   三级缓存   --  SingletonObjects(Map,所有由Spring构建的单例对象,都存放到了这个Map集合中)
    // 获取全部可以执行的全部strategy对象
    @Autowired    // 4.x 版本后，支持泛型注入
    private Map<String,Strategy> strategyObjects;    // 这个Map的key是当前对象在Spring容器中的唯一标识

    // 调用策略模块
    @Autowired
    private CacheService cacheService;


    public void execute(StandardSubmit submit){
        //1. 查询缓存中提供的执行顺序和要执行的策略标识
        String filters = cacheService.hget(CacheConstants.CACHE_PREFIX_CLIENT + submit.getClientID(), "filters");

        //2. 遍历全部strategy对象，根据执行顺序，依次执行策略方法
        for (String s : filters.split(",")) {
            Strategy strategy = strategyObjects.get(s);
            boolean flag = strategy.strategy(submit); // flag == true ,当前策略通过继续执行下依次
            if(!flag){
                // 当前策略执行失败,不能继续执行下一个策略
                break;
            }
        }
    }


}
